package cn.edu.xust.util;

import cn.edu.xust.communication.model.Result;
import cn.edu.xust.communication.util.Dlt645FrameUtils;
import cn.edu.xust.entity.DeviceEntity;
import lombok.extern.slf4j.Slf4j;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

import static cn.edu.xust.util.BCDUtils.convertToHexString;
import static cn.edu.xust.util.BCDUtils.processString;


@Slf4j
public class GenUtils {


    /**
     * 生辰指令 目前可以开关电表 查电表用的项目自带的
     * FE FE FE FE 前导码
     * 68 开始1
     * 88 90 78 56 34 12  地址
     * 68 开始2
     * 1C 控制码
     * 0F 数据长度
     * 35 33 33 33          36 33 33 33        4E       7C 86 4A 59 36 57
     * 02 00 00 00          03 00 00 00        1B       49 53 17 26 03 24
     * 密码                  操作者代码        继电器操作   日期年月日时分秒倒叙
     * 44 校验码
     * 16 结束
     *
     * @param deviceEntity
     * @param op
     * @return
     */
    public static String genEleControlCmd(DeviceEntity deviceEntity, String op) {
        StringBuffer cmd = new StringBuffer();
        if ("on".equals(op)) {
            //前导码
            cmd.append("FE FE FE FE ");
            //起始码
            cmd.append("68 ");
            //地址域
            cmd.append(processString(deviceEntity.getName())).append(" ");
            //起始码
            cmd.append("68 ");
            //控制码
            cmd.append("1C ");
            //数据长度域
            cmd.append("0F ");
            //数据域
            cmd.append(deviceEntity.getSecr()).append(" ");//密码
            cmd.append(deviceEntity.getOpcode()).append(" ");//操作码
            cmd.append("4E ");// 4d关 4e开
            LocalDateTime now = LocalDateTime.now();
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("ss mm HH dd MM yy");
            String formattedDate = now.format(formatter);
            //cmd.append("5E ");//预留位
            cmd.append(convertToHexString(formattedDate)).append(" ");//时间
            //校验码
            cmd.append(Dlt645FrameUtils.checkSum(cmd.substring(12)).toUpperCase()).append(" ");
            //结束码
            cmd.append("16");//预留位
        } else if ("off".equals(op)) {
            //前导码
            cmd.append("FE FE FE FE ");
            //起始码
            cmd.append("68 ");
            //地址域
            cmd.append(processString(deviceEntity.getName())).append(" ");
            //起始码
            cmd.append("68 ");
            //控制码
            cmd.append("1C ");
            //数据长度域
            cmd.append("0F ");
            //数据域
            cmd.append(deviceEntity.getSecr()).append(" ");//密码
            cmd.append(deviceEntity.getOpcode()).append(" ");//操作码
            cmd.append("4D ");// 4d关 4e开
            LocalDateTime now = LocalDateTime.now();
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("ss mm HH dd MM yy");
            String formattedDate = now.format(formatter);
            //cmd.append("5E ");//预留位
            cmd.append(convertToHexString(formattedDate)).append(" ");//时间
            //校验码
            cmd.append(Dlt645FrameUtils.checkSum(cmd.substring(12)).toUpperCase()).append(" ");
            //结束码
            cmd.append("16");//预留位
        } else if ("state".equals(op)) {
            //前导码
            cmd.append("FE FE FE FE ");
            //起始码
            cmd.append("68 ");
            //地址域
            cmd.append(processString(deviceEntity.getName())).append(" ");
            //起始码
            cmd.append("68 ");
            //控制码
            cmd.append("11 ");
            //数据长度域
            cmd.append("04 ");
            //数据域
            cmd.append("36 38 33 37 ");//命令序号
            //校验码
            cmd.append(Dlt645FrameUtils.checkSum(cmd.substring(12)).toUpperCase()).append(" ");
            //结束码
            cmd.append("16");//预留位
        }
        return cmd.toString();
    }


    /**
     * 解析额外增加的
     * FE FE FE FE 前导码
     * 68 开始1
     * 88 90 78 56 34 12  地址
     * 68 开始2
     * 1C 控制码
     * 0F 数据长度
     * 35 33 33 33          36 33 33 33        4E       7C 86 4A 59 36 57
     * 02 00 00 00          03 00 00 00        1B       49 53 17 26 03 24
     * 密码                  操作者代码        继电器操作   日期年月日时分秒倒叙
     * 44 校验码
     * 16 结束
     * <p>
     * <p>
     * 有个string.substring 超出的异常
     *
     * @return 36 38 33 37 代表读开闸状态
     */
    public static String parseExtraEleState(Result result) {
        String message = result.getMessage();
        if (message.length() < 30) {
            return "unknown";
        }
        //拿到操作码
        try {
            String ope = message.substring(28, 36);
            if ("36383337".equals(ope)) {
                //读状态
                String state = message.substring(36, 37);
                int num = Integer.parseInt(state, 16);  // 转换为整数
                num -= 3;  // 减3
                state = Integer.toHexString(num);  // 转换回十六进制字符串
                String bin = Integer.toBinaryString(Integer.parseInt(state, 16));  // 转换为二进制字符串
                String lastwei = bin.substring(bin.length() - 1);
                String res = lastwei.equals("1") ? "off" : "on";
                log.info("读到的状态:{},转二进制为:{},转义为:{}", state, bin, res);
                return res;
            }
        } catch (Exception e) {
            log.info("读电表状态失败:{}:error:{}", message,e.toString());
        }
        return "err";
    }




}
